﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Permissions;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;


namespace Prassi2ExpertUpTransfer
{
    public class Watcher
    {
        // Creo un nuovo FileSystemWatcher.
        FileSystemWatcher watcher;

        private static Form1 myForm1;

        public Watcher(Form1 myForm)
        {
            myForm1 = myForm;
        }

        public bool ControllaSeAvviato()
        {
            return (watcher.EnableRaisingEvents);
        }

        public void Stop()
        {
            watcher.EnableRaisingEvents = false;
        }

        public void Start()
        {

            Assembly ass = Assembly.GetEntryAssembly();
            string baseDir = Path.GetDirectoryName(ass.Location);

            string[] args = System.Environment.GetCommandLineArgs();

            // Creo un nuovo FileSystemWatcher.
            watcher = new FileSystemWatcher();

            // Se non è spacificato alcun parametro utilizzo la cartella dell'applicazione.
            if (args.Length != 2)
            {
                watcher.Path = baseDir;
            }
            else
            {
                watcher.Path = args[1];
            }

            // invio messaggio
            myForm1.AggiornaTextbox(Environment.NewLine);
            myForm1.AggiornaTextbox("Avviato il sistema d'ascolto dei TRASFER nella cartella: " + watcher.Path);
            myForm1.AggiornaTextbox(Environment.NewLine);

            /* Verifica i cambiamenti in LastAccess e LastWrite. */
            watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime |
                NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess |
                NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
                
            // Verifica solo file di testo.
            watcher.Filter = "*.txt";

            // Aggiungo i gestori di eventi.
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnCreated);
            watcher.Deleted += new FileSystemEventHandler(OnDeleted);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            watcher.EnableRaisingEvents = true;

        }

        // Gestore degli eventi.
        private static void OnCreated(object source, FileSystemEventArgs e)
        {
            myForm1.AggiornaTextbox(Environment.NewLine + Environment.NewLine + 
                "****************** Inizio elaborazione file: " + Path.GetFileName(e.FullPath));
            StringBuilder rigaTextBox = new StringBuilder();
            try
            {
                
                // istanzio la classe Trasfer
                TrasferPrassi trasfer = new TrasferPrassi(e.FullPath);

                if (trasfer.Elabora())
                {
                    TrasferExpertUp teu = Prassi2ExpertUpTransfer.TrasferExpertUp.ElaboraTrasferPrassi(trasfer);

                    if (teu.ScriviTrasferExpertUp(trasfer.Path_File, trasfer))
                    {
                        myForm1.AggiornaTextbox("Conversione terminata file: " + trasfer.Name_File());
                    }
                    else
                    {
                        myForm1.AggiornaTextbox(Color.Red);
                        myForm1.AggiornaTextbox("Errori nella conversione del file: " + trasfer.Name_File());
                    }

                }
                else
                {
                    myForm1.AggiornaTextbox(Color.Red);
                    myForm1.AggiornaTextbox("Errore nella elaborazione del file: " + e.FullPath);
                }

            }
            catch (Exception err)
            {
                myForm1.AggiornaTextbox(Color.Red);
                // TODO Exception in elaborazione da Watcher
                rigaTextBox.Append("Errore nella elaborazione: " + Path.GetFileName(e.FullPath) + ". ");
                
                rigaTextBox.Append(Environment.NewLine + "Errore: " + err.ToString());

                myForm1.AggiornaTextbox(rigaTextBox.ToString());
            }


        }

        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            //myForm1.AggiornaTextbox("<<OnChanged>> File : " + e.FullPath + " " + e.ChangeType);
        }

        private static void OnDeleted(object source, FileSystemEventArgs e)
        {
            //myForm1.AggiornaTextbox("<<OnDeleted>> File : " + e.FullPath + " " + e.ChangeType);
        }

        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            //myForm1.AggiornaTextbox("<<OnRenamed>> File : " + e.OldFullPath + " renamed to " + e.FullPath);
        }



    }
}